package com.settlement.system.common.util.common;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;

/**
 * 功能：利用并行流快速插入/修改数据
 *
 * @author hc
 * @since 2021/9/14
 */
public class BaseConsumer {
    /**
     * 每个长 SQL 插入/修改的行数，可以根据数据库性能调整
     */
    private final static int SIZE = 200;

    /**
     * 如果需要调整并发数目，修改下面方法的第二个参数即可
     */
    static {
        System.setProperty("java.util.concurrent.ForkJoinPool.common.parallelism", "4");
    }

    /**
     * 方法
     * @param list     数据集合
     * @param consumer 消费型方法，直接使用 mapper::method 方法引用的方式
     * @param <T>      数据类型
     */
    public static <T> void batchData(List<T> list, Consumer<List<T>> consumer) {
        if (list == null || list.size() < 1) {
            return;
        }
        List<List<T>> streamList = new ArrayList<>();
        for (int i = 0; i < list.size(); i += SIZE) {
            int j = Math.min((i + SIZE), list.size());
            List<T> subList = list.subList(i, j);
            streamList.add(subList);
        }
        // 并行流使用的并发数是 CPU 核心数，不能局部更改
        streamList.parallelStream().forEach(consumer);
    }
}
